package Day022_XML_Dom4j.demo2_Dom4j;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

/**
 * @author zhangyan
 * @date 2020/5/16 11:40
 */
/*
    解析原理:
        XML DOM 和 HTML DOM一样，XML DOM 将整个XML文档加载到内存，生成一个DOM树，
        并获得一个Document对象，通过Document对象就可以对DOM进行操作

    DOM中的核心概念就是节点，在XML文档中的元素、属性、文本，在DOM中都是节点！所有的节点都封装到了Document对象中

    解析步骤:
       1.导入dom4j的jar包
       2.创建解析器
       3.读取xml 获取document对象
       4.得到根元素
       5.根据根元素获取对应的子元素或者属性

    常用的方法:
            SAXReader对象:
                         new SAXReader() 创建解析器对象
                         Document read(String url) 解析器读取文件

            Document对象:
                         标签/元素Element  父类Node 都是表示标签/元素
                         Element getRootElement() 获得根元素

            Element对象:
                         List elements([String ele] )               获得指定名称的所有子元素。可以不指定名称
                         String getText()                           获得当前元素的文本内容
                         String getName()                           获得当前元素的元素名
                         String attributeValue(String attrName)     获得指定属性名的属性值

                         Element element([String ele])              获得指定名称第一个子元素。可以不指定名称
                         String elementText(Sting ele)              获得指定名称子元素的文本值

 */
public class Test2_Dom4j {
    public static void main(String[] args) throws Exception{
        // 创建解析器对象
        SAXReader sr = new SAXReader();

        // 使用解析器解析xml文件,生成document对象
        Document document = sr.read("Demo02\\src\\Day022_XML_Dom4j\\demo1_XML\\tianqi.xml");

        // 使用document对象获得根元素
        Element rootE = document.getRootElement();
        System.out.println(rootE);

        // elements()     				: 获取当前元素的所有子元素
        // 获取根元素下的所有子元素
        List<Element> eList = rootE.elements();
        System.out.println("根元素下子元素的个数:"+eList.size());// 3

        // 遍历根元素下的所有子元素 的名称
        for (Element e : eList) {
            // getName()					: 获取元素的元素名
            System.out.println(e.getName());
        }

        System.out.println("=======================");
        // element(String name)		: 根据元素名获取指定子元素(如果有多个就获取到第一个)
        // 获取根元素下的北京子元素
        Element e1 = rootE.element("北京");
        System.out.println(e1.getName());// 北京

        System.out.println("====================");
        // 获取北京下的子元素湿度的文本
        // elementText(String name)	: 获取指定子元素的文本值,参数是子元素名称
        System.out.println(e1.elementText("湿度"));// 20%

        System.out.println("====================");

        // getText()					: 获取当前元素的文本值
        // 获取北京下的子元素湿度
        Element e2 = e1.element("湿度");
        System.out.println(e2.getText());// 20%

        System.out.println("====================");
        // attributeValue(String name)	: 获取当前元素下某个属性的值
        // 获取北京元素的provide属性的值
        System.out.println(e1.attributeValue("id"));// 1

    }

}
